package ca.csf.dfc.poo.iu;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * Classe représentant l'interface utilisé pour affiché les High Scores des trois types de robots
 * dans un environnement donné.
 * 
 * @author Jean-François Bédard, Marie-Pier Chabot, 
 * Alexandre Paquet Fasys, Claude Roy
 *
 */
public class IntHighScores extends JDialog
{
	/**
	 * Étiquette titre de la fenêtre
	 */
	protected JLabel m_LblTitre = new JLabel("High Scores",JLabel.CENTER);
	
	/**
	 * Bouton quitter de la fenêtre
	 */
	protected JButton m_BtnQuitter = new JButton("Retour");
	
	/**
	 * Tableau des scores reçu lorsqu'on crée la fenêtre.
	 * On recoit dans l'ordre les scores de :
	 * Robot intelligent, Robot greedy et Robot random.
	 */
	protected int[] m_TabScores;
	
	/**
	 * Nom de l'environnement dont on affiche le score.
	 */
	protected JLabel m_LblNomEnv;
	
	/**
	 * Étiquette pour la date de la simulation.
	 */
	protected JLabel m_LblDate = new JLabel("Date :");
	
	/**
	 * Étiquette pour l'affichage de la date trouvée dans la BD.
	 */
	protected JLabel m_LblDateTrouvee = new JLabel();
	
	/**
	 * Étiquette pour le nom de l'environnement.
	 */
	protected JLabel m_LblEnvironnement = new JLabel("Environnement :");
	
	/**
	 * Panneau qui affiche Le type d'information qu'on va afficher
	 * (Type de robots et Scores dans notre cas)
	 */
	protected JPanel m_PanneauInfos = new JPanel();
	
	/**
	 * Panneau affichant les informations du type de robots ayant le meilleur scores.
	 */
	protected JPanel m_PanneauPremier = new JPanel();
	
	/**
	 * Panneau affichant les informations du type de robots ayant le deuxième meilleur scores.
	 */
	protected JPanel m_PanneauDeuxieme = new JPanel();
	
	/**
	 * Panneau affichant les informations du type de robots ayant le troisième meilleur scores.
	 */
	protected JPanel m_PanneauTroisieme = new JPanel();
	
	/**
	 * Panneau qui contient les informations par rapport à l'environnement qu'on veut afficher le scores.
	 */
	protected JPanel m_PanneauEnvironnement = new JPanel();
	
	/**
	 * Panneau qui contient le ou les boutons à afficher.
	 */
	protected JPanel m_PanneauBoutons = new JPanel();
	
	/**
	 * Constructeur d'initialisation de notre fenêtre.
	 * @param tabScores : Tableau de 3 scores contenant dans l'ordre : Robots Intelligents, Robots Greedys et Robots Randoms.
	 * @param p_NomEnv : Nom de l'environnement duquel on veut afficher le score.
	 */
	public IntHighScores(int[] tabScores,String p_NomEnv, String p_Date)
	{
		m_TabScores = tabScores;
		
		m_LblNomEnv = new JLabel(p_NomEnv);
		
		m_LblDateTrouvee.setText(p_Date);
		
		this.setTitle("High scores");
		this.setSize(400, 400);
		
		m_LblTitre.setFont(new Font("Serif", Font.BOLD, 24));
		
		this.setLayout(new GridLayout(7,1));
		this.setLocationRelativeTo(null);
		
		//panneau info
		this.m_PanneauInfos.add(m_LblDate);
		this.m_PanneauInfos.add(m_LblDateTrouvee);
		this.m_PanneauInfos.setLayout(new FlowLayout());
		
		//TrierScores
		trierScores();
		
		//Panneau Environnement
		this.m_PanneauEnvironnement.add(m_LblEnvironnement);
		this.m_PanneauEnvironnement.add(m_LblNomEnv);
		
		//PanneauBoutons
		this.m_PanneauBoutons.setLayout(new FlowLayout());
		this.m_BtnQuitter.setPreferredSize(new Dimension(100,40));
		this.m_PanneauBoutons.add(m_BtnQuitter);
		
		this.m_BtnQuitter.addActionListener(new GestQuitter());
		this.add(m_LblTitre);
		this.add(m_PanneauEnvironnement);
		this.add(m_PanneauInfos);
		this.add(m_PanneauPremier);
		this.add(m_PanneauDeuxieme);
		this.add(m_PanneauTroisieme);
		this.add(m_PanneauBoutons);
	}
	
	/**
	 * Méthode qui se sert du tableau qui contient les 3 scores en ordre de (Robots intelligent, Robot greedy,Robot random)
	 * Et les trie en ordre du score du plus grand au plus petits.
	 */
	private void trierScores()
	{
		//On calcul le plus grand
		int plusGrand = this.m_TabScores[0];
		int indicePlusGrand = 0;
		
		if (this.m_TabScores[1] > plusGrand)
		{
			plusGrand = this.m_TabScores[1];
			indicePlusGrand = 1;
		}
		
		if (this.m_TabScores[2] > plusGrand)
		{
			plusGrand = this.m_TabScores[2];
			indicePlusGrand = 2;
		}
		
		//On calcul le plus petit
		int plusPetit = this.m_TabScores[2];
		int indicePlusPetit = 2;
		
		if (this.m_TabScores[1] < plusPetit)
		{
			plusPetit = this.m_TabScores[1];
			indicePlusPetit = 1;
		}
		
		if (this.m_TabScores[0] < plusPetit)
		{
			plusPetit = this.m_TabScores[0];
			indicePlusPetit = 0;
		}
		
		//On trouve l'indice du milieu
		int indiceMoyen = 0;
		int moyen = this.m_TabScores[0];
		
		for(int i = 0;i<3;i++)
		{
			if((indicePlusPetit != i) && (indicePlusGrand != i))
			{
				indiceMoyen = i;
				moyen = this.m_TabScores[indiceMoyen];
				break;
			}
		}
		
		//On met les scores dans les panneau respectifs
		//Selon l'ordre du plus grand au plus petit.
		//panneau premier
		this.m_PanneauPremier.setLayout(new FlowLayout());
		this.m_PanneauPremier.add(new JLabel(this.getLabel(indicePlusGrand)));
		this.m_PanneauPremier.add(new JLabel(Integer.toString(plusGrand)));
		
		//panneau deuxieme
		this.m_PanneauDeuxieme.setLayout(new FlowLayout());
		this.m_PanneauDeuxieme.add(new JLabel(this.getLabel(indiceMoyen)));
		this.m_PanneauDeuxieme.add(new JLabel(Integer.toString(moyen)));
		
		//panneau troisieme
		this.m_PanneauTroisieme.setLayout(new FlowLayout());
		this.m_PanneauTroisieme.add(new JLabel(this.getLabel(indicePlusPetit)));
		this.m_PanneauTroisieme.add(new JLabel(Integer.toString(plusPetit)));
	}
	
	/**
	 * Méthode qui retourne une string selon l'indice reçu en paramètre.
	 * @param p_Indice Indice dans le tableau des scores (entre 0 et 2)
	 * @return 0 représente le Robot Intelligent, 1 le Robot Greedy et 2 le Robot Random.
	 */
	private String getLabel(int p_Indice)
	{
		String retour = "";
		
		switch (p_Indice)
		{
		case 0:
			retour = "Robot Intelligent :";
			break;
		case 1:
			retour = "Robot Greedy :";
			break;
		case 2:
			retour = "Robot Random :";
			break;
		}
		
		return retour;
	}
	
	/**
	 * Classe qui permet de gerer la gestion du bouton quitter.
	 * 
	 * @author Jean-François Bédard, Marie-Pier Chabot, 
	 * Alexandre Paquet Fasys, Claude Roy
	 */
	private class GestQuitter implements ActionListener
	{

		/**
		 * Méthode pour gérer le clic du bouton «Quitter».
		 */
		@Override
		public void actionPerformed(ActionEvent p_arg0)
		{
			// On ferme la fenêtre.
			IntHighScores.this.dispose();
		}
	}
}
